package DAO;

import Model.AplicacaoInjecao;
import VO.VOAplicacaoInjecao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import javax.swing.JOptionPane;

/**
 * Classe criada para realizar operações no banco de dados.
 * @author Tiago
 * @since Classe criada em 17/09/2013.
 */

public class DAOAplicacaoInjecao {
    Connection con;
    PreparedStatement pre = null;
    Conexao conexao = new Conexao();
    
    public void lancarAplicacaoInjecao(AplicacaoInjecao a){
        con = conexao.obterConexao();
        try{
            String sql = "update aplicacao_injecao set situacao_aplicacao_injecao=? where cod_aplicacao_injecao=?";
            pre = con.prepareStatement(sql);
            pre.setInt(1, 1); //O número 1 na tabela aplicacao_injecao indica que a aplicação foi lançada.
            pre.setInt(2, a.getCod_aplicacao());
            System.out.println("Comando SQL formado: "+ pre);
            pre.executeUpdate();
            int r = pre.executeUpdate();
                if(r > 0){
                    JOptionPane.showMessageDialog(null, "Aplicação Lançada com Sucesso!");
                }
                else{
                    JOptionPane.showMessageDialog(null, "Aplicação Inválida!");
                }
        }
        catch(SQLException e){
            System.out.println("Aplicação de Injeção - Erro: " + e.getMessage());
        }
    }

  public ArrayList<VOAplicacaoInjecao> obterAplicacao(){
        ArrayList<VOAplicacaoInjecao> listaAplicacoes = new ArrayList();
        try{
            con = conexao.obterConexao();
            String sql = "SELECT DISTINCT cod_aplicacao_injecao, cod_usuario, usuario.nome, " +
                         "	ampolas_aplicacao_injecao, braco_aplicacao_injecao, prazo_aplicacao_injecao, " +
                         "	situacao_aplicacao_injecao, cod_receita, data_aplicacao_injecao " +
                         "FROM aplicacao_injecao " +
                         "INNER JOIN usuario ON aplicacao_injecao.cod_usuario = usuario.numero_prontuario";
            
            pre = con.prepareStatement(sql);
            ResultSet rs;
            rs = pre.executeQuery();
            //cada linha (registro) resultado da consulta sql, será armazenado em um
            //objeto AgendamentoVO, que por sua vez será adicionado em um ArrayList
            while(rs.next()){
                VOAplicacaoInjecao apVO = new VOAplicacaoInjecao();
                apVO.setCodAplicacao(rs.getString("cod_aplicacao_injecao"));
                apVO.setCodUsuario(rs.getString("cod_usuario"));
                apVO.setNomeUsuario(rs.getString("nome"));
                apVO.setAmpolas(rs.getString("ampolas_aplicacao_injecao"));
                apVO.setBraco(rs.getString("braco_aplicacao_injecao"));
                apVO.setPrazo(rs.getString("prazo_aplicacao_injecao"));
                if(rs.getString("situacao_aplicacao_injecao").equals("1")){
                    apVO.setSituacao("Lançado");
                }
                else{
                    apVO.setSituacao("Pendente");
                }
                apVO.setCodReceita(rs.getString("cod_receita"));
                apVO.setDataAplicacao(rs.getString("data_aplicacao_injecao"));
                listaAplicacoes.add(apVO);
            }
        }
        catch(Exception e){
            System.out.println("Erro: " + e.getMessage());
        }
        return listaAplicacoes;
    }  
  
  public ArrayList<VOAplicacaoInjecao> pesquisarPorUsuario(String nome){
        ArrayList<VOAplicacaoInjecao> listaAplicacoes = new ArrayList();
        try{
            con = conexao.obterConexao();
            String sql = "SELECT DISTINCT cod_aplicacao_injecao, cod_usuario, usuario.nome, " +
                         "	ampolas_aplicacao_injecao, braco_aplicacao_injecao, prazo_aplicacao_injecao, " +
                         "	situacao_aplicacao_injecao, cod_receita, data_aplicacao_injecao " +
                         "FROM aplicacao_injecao " +
                         "INNER JOIN usuario ON aplicacao_injecao.cod_usuario = usuario.numero_prontuario " +
                         "WHERE usuario.nome LIKE ?";
            
            pre = con.prepareStatement(sql);
            pre.setString(1, nome + '%');
            ResultSet rs;
            rs = pre.executeQuery();
            //cada linha (registro) resultado da consulta sql, será armazenado em um
            //objeto AgendamentoVO, que por sua vez será adicionado em um ArrayList
            while(rs.next()){
                VOAplicacaoInjecao apVO = new VOAplicacaoInjecao();
                apVO.setCodAplicacao(rs.getString("cod_aplicacao_injecao"));
                apVO.setCodUsuario(rs.getString("cod_usuario"));
                apVO.setNomeUsuario(rs.getString("nome"));
                apVO.setAmpolas(rs.getString("ampolas_aplicacao_injecao"));
                apVO.setBraco(rs.getString("braco_aplicacao_injecao"));
                apVO.setPrazo(rs.getString("prazo_aplicacao_injecao"));
                if(rs.getString("situacao_aplicacao_injecao").equals("1")){
                    apVO.setSituacao("Lançado");
                }
                else{
                    apVO.setSituacao("Pendente");
                }
                apVO.setCodReceita(rs.getString("cod_receita"));
                apVO.setDataAplicacao(rs.getString("data_aplicacao_injecao"));
                listaAplicacoes.add(apVO);
            }
        }
        catch(Exception e){
            System.out.println("Erro: " + e.getMessage());
        }
        return listaAplicacoes;
    }
  
  public ArrayList<VOAplicacaoInjecao> pesquisarPendentePorUsuario(String nome){
        ArrayList<VOAplicacaoInjecao> listaAplicacoes = new ArrayList();
        try{
            con = conexao.obterConexao();
            String sql = "SELECT DISTINCT cod_aplicacao_injecao, cod_usuario, usuario.nome, " +
                         "	ampolas_aplicacao_injecao, braco_aplicacao_injecao, prazo_aplicacao_injecao, " +
                         "	situacao_aplicacao_injecao, cod_receita, data_aplicacao_injecao " +
                         "FROM aplicacao_injecao " +
                         "INNER JOIN usuario ON aplicacao_injecao.cod_usuario = usuario.numero_prontuario " +
                         "WHERE usuario.nome LIKE ?" +
                         "AND aplicacao_injecao.situacao_aplicacao_injecao = 0";
            
            pre = con.prepareStatement(sql);
            pre.setString(1, nome + '%');
            ResultSet rs;
            rs = pre.executeQuery();
            //cada linha (registro) resultado da consulta sql, será armazenado em um
            //objeto AgendamentoVO, que por sua vez será adicionado em um ArrayList
            while(rs.next()){
                VOAplicacaoInjecao apVO = new VOAplicacaoInjecao();
                apVO.setCodAplicacao(rs.getString("cod_aplicacao_injecao"));
                apVO.setCodUsuario(rs.getString("cod_usuario"));
                apVO.setNomeUsuario(rs.getString("nome"));
                apVO.setAmpolas(rs.getString("ampolas_aplicacao_injecao"));
                apVO.setBraco(rs.getString("braco_aplicacao_injecao"));
                apVO.setPrazo(rs.getString("prazo_aplicacao_injecao"));
                if(rs.getString("situacao_aplicacao_injecao").equals("1")){
                    apVO.setSituacao("Lançado");
                }
                else{
                    apVO.setSituacao("Pendente");
                }
                apVO.setCodReceita(rs.getString("cod_receita"));
                apVO.setDataAplicacao(rs.getString("data_aplicacao_injecao"));
                listaAplicacoes.add(apVO);
            }
        }
        catch(Exception e){
            System.out.println("Erro: " + e.getMessage());
        }
        return listaAplicacoes;
    }
  
  public ArrayList<VOAplicacaoInjecao> obterAplicacaoLancada(){
        ArrayList<VOAplicacaoInjecao> listaAplicacoes = new ArrayList();
        try{
            con = conexao.obterConexao();
            String sql = "SELECT cod_aplicacao_injecao, cod_usuario, usuario.nome, " +
                         "	ampolas_aplicacao_injecao, braco_aplicacao_injecao, prazo_aplicacao_injecao, " +
                         "	situacao_aplicacao_injecao, cod_receita, data_aplicacao_injecao " +
                         "FROM aplicacao_injecao " +
                         "INNER JOIN usuario ON aplicacao_injecao.cod_usuario = usuario.numero_prontuario " +
                         "WHERE aplicacao_injecao.situacao_aplicacao_injecao = 1";
            
            pre = con.prepareStatement(sql);
            ResultSet rs;
            rs = pre.executeQuery();
            //cada linha (registro) resultado da consulta sql, será armazenado em um
            //objeto AgendamentoVO, que por sua vez será adicionado em um ArrayList
            while(rs.next()){
                VOAplicacaoInjecao apVO = new VOAplicacaoInjecao();
                apVO.setCodAplicacao(rs.getString("cod_aplicacao_injecao"));
                apVO.setCodUsuario(rs.getString("cod_usuario"));
                apVO.setNomeUsuario(rs.getString("nome"));
                apVO.setAmpolas(rs.getString("ampolas_aplicacao_injecao"));
                apVO.setBraco(rs.getString("braco_aplicacao_injecao"));
                apVO.setPrazo(rs.getString("prazo_aplicacao_injecao"));
                if(rs.getString("situacao_aplicacao_injecao").equals("1")){
                    apVO.setSituacao("Lançado");
                }
                else{
                    apVO.setSituacao("Pendente");
                }
                apVO.setCodReceita(rs.getString("cod_receita"));
                apVO.setDataAplicacao(rs.getString("data_aplicacao_injecao"));
                listaAplicacoes.add(apVO);
            }
        }
        catch(Exception e){
            System.out.println("Erro: " + e.getMessage());
        }
        return listaAplicacoes;
    }
  
  public ArrayList<VOAplicacaoInjecao> obterAplicacaoPendente(){
        ArrayList<VOAplicacaoInjecao> listaAplicacoes = new ArrayList();
        try{
            con = conexao.obterConexao();
            String sql = "SELECT cod_aplicacao_injecao, cod_usuario, usuario.nome, " +
                         "	ampolas_aplicacao_injecao, braco_aplicacao_injecao, prazo_aplicacao_injecao, " +
                         "	situacao_aplicacao_injecao, cod_receita, data_aplicacao_injecao " +
                         "FROM aplicacao_injecao " +
                         "INNER JOIN usuario ON aplicacao_injecao.cod_usuario = usuario.numero_prontuario " +
                         "WHERE aplicacao_injecao.situacao_aplicacao_injecao = 0";
            
            pre = con.prepareStatement(sql);
            ResultSet rs;
            rs = pre.executeQuery();
            //cada linha (registro) resultado da consulta sql, será armazenado em um
            //objeto AgendamentoVO, que por sua vez será adicionado em um ArrayList
            while(rs.next()){
                VOAplicacaoInjecao apVO = new VOAplicacaoInjecao();
                apVO.setCodAplicacao(rs.getString("cod_aplicacao_injecao"));
                apVO.setCodUsuario(rs.getString("cod_usuario"));
                apVO.setNomeUsuario(rs.getString("nome"));
                apVO.setAmpolas(rs.getString("ampolas_aplicacao_injecao"));
                apVO.setBraco(rs.getString("braco_aplicacao_injecao"));
                apVO.setPrazo(rs.getString("prazo_aplicacao_injecao"));
                if(rs.getString("situacao_aplicacao_injecao").equals("1")){
                    apVO.setSituacao("Lançado");
                }
                else{
                    apVO.setSituacao("Pendente");
                }
                apVO.setCodReceita(rs.getString("cod_receita"));
                apVO.setDataAplicacao(rs.getString("data_aplicacao_injecao"));
                listaAplicacoes.add(apVO);
            }
        }
        catch(Exception e){
            System.out.println("Erro: " + e.getMessage());
        }
        return listaAplicacoes;
    }
  
  public ArrayList<VOAplicacaoInjecao> pesquisarPorData(Date dataInicial, Date dataFinal){
        ArrayList<VOAplicacaoInjecao> listaAplicacoes = new ArrayList();
        try{
            con = conexao.obterConexao();
            String sql = "SELECT DISTINCT cod_aplicacao_injecao, cod_usuario, usuario.nome, " +
                         "	ampolas_aplicacao_injecao, braco_aplicacao_injecao, prazo_aplicacao_injecao, " +
                         "	situacao_aplicacao_injecao, cod_receita, data_aplicacao_injecao " +
                         "FROM aplicacao_injecao " +
                         "INNER JOIN usuario ON aplicacao_injecao.cod_usuario = usuario.numero_prontuario " +
                         "WHERE aplicacao_injecao.data_aplicacao_injecao BETWEEN ? AND ?";
            
            pre = con.prepareStatement(sql);
            pre.setDate(1, (java.sql.Date) dataInicial);
            pre.setDate(2, (java.sql.Date) dataFinal);
            ResultSet rs;
            rs = pre.executeQuery();
            //cada linha (registro) resultado da consulta sql, será armazenado em um
            //objeto AgendamentoVO, que por sua vez será adicionado em um ArrayList
            while(rs.next()){
                VOAplicacaoInjecao apVO = new VOAplicacaoInjecao();
                apVO.setCodAplicacao(rs.getString("cod_aplicacao_injecao"));
                apVO.setCodUsuario(rs.getString("cod_usuario"));
                apVO.setNomeUsuario(rs.getString("nome"));
                apVO.setAmpolas(rs.getString("ampolas_aplicacao_injecao"));
                apVO.setBraco(rs.getString("braco_aplicacao_injecao"));
                apVO.setPrazo(rs.getString("prazo_aplicacao_injecao"));
                if(rs.getString("situacao_aplicacao_injecao").equals("1")){
                    apVO.setSituacao("Lançado");
                }
                else{
                    apVO.setSituacao("Pendente");
                }
                apVO.setCodReceita(rs.getString("cod_receita"));
                apVO.setDataAplicacao(rs.getString("data_aplicacao_injecao"));
                listaAplicacoes.add(apVO);
            }
        }
        catch(Exception e){
            System.out.println("Erro: " + e.getMessage());
        }
        return listaAplicacoes;
    }
  
} //Fim da classe
